//  封装 ajax 进行数据请求
function doAjax(options) {
  //  创建 ajax 对象
  const xhr = window.XMLHttpRequest
    ? new XMLHttpRequest()
    : new ActiveXObject('Microsoft.XMLHTTP');

  //  对传递进来的参数进行处理
  let url = options.url,  //  完整的路径
    method = (options.method || 'GET').toUpperCase(),
    async = String(options.async) === 'false' ? false : true,
    data = options.data || null,
    headers = options.headers || {},
    success = options.success || function () { },
    error = options.error || function () { };

  //   判读有没有传入 url
  if (!url) {
    throw new Error('请传入 url');
  }

  //  判断传入的请求方式是否正确
  if (method !== 'GET' && method !== 'POST') {
    throw new Error('请传入正确的请求方式');
  }

  //  判断当前请求方式，并对对应的请求方式进行处理
  if (method === 'GET') {
    //  如果是 get 方式，将 data 通过请求参数拼接在 url后面
    url += url.includes('?') ? '&' + formatData(data) : '?' + formatData(data);
    data = null;  //  如果是 get 方式，data 为 null
  } else if (method === 'POST') {
    data = formatData(data);
  }

  //  建立 tcp 连接
  xhr.open(method, url, async);

  //  设置 headers
  for (let key in headers) {
    xhr.setRequestHeader(key, options.headers[key]);
  }

  //   设置请求头
  if (method == 'PSOT') xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

  //  发送数据， 通过请求方式 对data数据进行处理
  xhr.send(data);

  return new Promise((resolve, reject) => {
    //  监听状态改变事件
    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4) {
        if (xhr.status == 200 && xhr.status < 300 || xhr.status == 304) {
          success(xhr.responseText);
          resolve(xhr.responseText);
        } else {
          error(xhr.responseText);
          reject(xhr.responseText);
        }
      }
    }
  });
}

//  格式化 data数据
function formatData(data) {
  let str = '';
  for (let key in data) {
    str += key + '=' + data[key] + '&';
  }

  return str.replace(/&$/, '');
}

export function request(options) {
  return doAjax(options);
}